﻿//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//    Crolengi, this program (a part of program) is gameengine based on C++\Directx
//    Copyright (C) 2008 Pashinin Anton Alekseevich (Crol)
//
//    This program is free software: you can redistribute it and/or modify
//    it under the terms of the GNU General Public License as published by
//    the Free Software Foundation, either version 3 of the License, or
//    (at your option) any later version.
//
//    This program is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//    GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License
//    along with this program.  If not, see <http://www.gnu.org/licenses/>.
//    (INCLUDING NEGLIGENCE OR OTHERWISE) 
//    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
//    EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//    Contacts: 
//    Mail: crolengi@gmail.com
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef  object_super_class_h
#define  object_super_class_h

#include "..\\import\\CRLEngi_strings_lib\\CRLEngi_strings.h"
#include "..\\import\\param_trees_lib\\param_trees.h"

//////////////////////////////////////////////////////[КЛАСС]//////////////////////////////////////////////////////
///// 
/////  СТАНДАРТНЫЙ КЛАСС ДЛЯ ОБЪЕКТОВ 
///// 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Object_Super
{
	public:
	DynamicRow         ObjProperties;

	LPDIRECT3DDEVICE9    *pd3dDevice; // Our rendering device

	D3DXMATRIXA16           GOMatrix; // клон мировой матрицы
	D3DXMATRIX           GOMatrixDef; // матрица объекта

	D3DXVECTOR3     Position,Rotation;

	////////////////////////////////////////////////////[ФУНКЦИИ]//////////////////////////////////////////////////////
	protected:
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//                                                      функция установки матрицы (вызывается на загрузке объекта)
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	void GOMatrixTranslateDef(D3DXMATRIX *matr){


		int	id    = ObjProperties.iLookId("position");
		int count = ObjProperties.iCountParams(id);
		int x,y,z;
		x = 0;
		y = 0;
		z = 0;

		if (id>0)
			if (count>=3)
			{
				id = ObjProperties.TopId(id);
				x  = (ObjProperties.iLookName(id)).toInt();
				id = ObjProperties.NextId(id);
				y  = (ObjProperties.iLookName(id)).toInt();
				id = ObjProperties.NextId(id);
				z  = (ObjProperties.iLookName(id)).toInt();
			}
			else
			if (count=2)
			{
			    id = ObjProperties.TopId(id);
				x  = (ObjProperties.iLookName(id)).toInt();
				id = ObjProperties.NextId(id);
				y  = (ObjProperties.iLookName(id)).toInt();
				z = 0;
			}
			else
			if (count=1)
			{
			    id = ObjProperties.TopId(id);
				x = (ObjProperties.iLookName(id)).toInt();
				y = 0;
			    z = 0;
			}


			D3DXMatrixTranslation(matr,x,y,z);
	}
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	///////                                                                                          глобальные функции
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	public:
		virtual bool  InitParameters(){return true;};
		virtual void  Render(unsigned int LightId,bool Lfirst){};
	const D3DXMATRIX& GetWorldPos() const  {
		 return GOMatrixDef;
	     }
	void  SetWorldPos(D3DXMATRIX* matrix)  {
		 GOMatrixDef = *matrix;
	     }
	void  Positioning(){
		 (*pd3dDevice)->SetTransform( D3DTS_WORLD, &GetWorldPos());
	     }

		bool    Console_Input(CRLEngi_string  Command){
		/// приходит ***manager self [command]    - команда адресованна менеджеру а не его элементам
		/// приходит ***manager [name] [command]  - команда адресованна его элементам
		/// приходит ***manager [id] [command]  - команда адресованна его элементам
		return true;
		
			 
	}
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//                                                                                                      КОНСТРУКТОР
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	public:
	Object_Super(D3DXMATRIXA16* GMatrix,char* FProperties,LPDIRECT3DDEVICE9 *Device){ 
		GOMatrixDef = *GMatrix;             // получаем мировую матрицу проекции
	    D3DXMatrixIdentity(&GOMatrix);     // обрабатываем созданную матрицу

		CRLEngi_string file;
		file = FProperties;
		ObjProperties.iLoadFromFile(file); //загрузка параметров


		pd3dDevice = Device;
	};

	 Object_Super(D3DXMATRIXA16* GMatrix,CRLEngi_string file){ 
		GOMatrixDef = *GMatrix;             // получаем мировую матрицу проекции
	    D3DXMatrixIdentity(&GOMatrix);     // обрабатываем созданную матрицу

		ObjProperties.iLoadFromFile(file); //загрузка параметров
	};

	Object_Super(){ 

	};
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//                                                                                                       ДЕСТРУКТОР
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	virtual ~Object_Super(){
	};
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#endif 